import type {AxiosInstance} from "axios";
import axios from "axios";
import {Dialog, showToast, Toast} from 'vant';
import router from "@/router";


const baseURL = import.meta.env.MODE === 'development'

const request: AxiosInstance = axios.create({
    // @ts-ignore
    baseURL: baseURL ? "http://localhost:4445/dev-api" : "http://localhost:4445",
    timeout:  20000,
    withCredentials: true, // 允许携带 cookies
    headers: {
        'Content-Type': 'application/json;charset=UTF-8',
    },
});


// 添加请求拦截器
request.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    console.log("我要发送请求：", config)
    // 设置默认 Content-Type（根据后端要求，如 json 或 form-data）
    if (!config.headers['Content-Type']) {
        config.headers['Content-Type'] = 'application/json;charset=utf-8';
    }
    // 添加国际化语言标识（如后端需要区分多语言）
    config.headers['Accept-Language'] = localStorage.getItem('lang') || 'zh-CN';
    return config;
}, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
});

// 添加响应拦截器
request.interceptors.response.use(
    // 1. 响应成功（HTTP状态码200）：处理业务状态码
    (response) => {
        // 后端统一返回格式：{ code: 业务状态码, message: 描述, data: 业务数据 }
        const { code, message, data, description } = response.data;
        console.log("拦截器里的", response.data)

        // 1.1 业务成功（code=0，对应后端SUCCESS）
        if (code === 0) {
            // 只返回data给前端（前端直接拿数据，不用每次解构code/message）
            return response;
        }

        // 1.2 业务失败：根据后端状态码执行不同逻辑
        else {
            // 1.2.1 未登录（code=40101）：清除token + 跳转登录页
            if (code === 40101) {
                showToast("请登录")
                router.push("/user/login");
                return Promise.reject(new Error('未登录，请重新登录'));
            }

            // 1.2.2 无权限（code=40100）/禁止访问（40301）：提示并跳转首页
            else if (code === 40100 || code === 40301) {
                showToast('您无权限访问此功能');
                router.push('/user/login'); // 跳转到首页或无权限页面
                return Promise.reject(new Error('无权限访问'));
            }

            else if (response.data.code === 50000) {
                showToast('系统异常');
                return Promise.reject(new Error('业务错误'));
            }
            else {
                // 提示后端返回的错误描述（如“加入队伍失败”“请求数据为空”）
                showToast(description || '操作失败，请稍后重试');
                // 把错误抛给前端业务代码（如需单独处理，可在catch中捕获）
                return Promise.reject(new Error(`业务错误：code=${code}`));
            }
        }
    },

    // 2. 响应失败（HTTP状态码非200，如404、500）
    (error) => {
        // 2.1 网络错误（如断网）
        if (!error.response) {
            showToast('网络异常，请检查网络连接');
            return Promise.reject(new Error('网络异常'));
        }

        // 2.2 HTTP状态码错误（如500系统异常、404接口不存在）
        const { status, statusText } = error.response;
        // 系统内部异常（对应后端SYSTEM_ERROR 50000，若后端HTTP状态码也返回500）
        if (status === 500) {
            showToast('系统内部异常，请联系管理员或稍后重试');
        }
        // 接口不存在（404）
        else if (status === 404) {
            showToast(`接口不存在：${error.config.url}`);
        }
        // 其他HTTP错误（如405方法不允许）
        else {
            showToast(`请求失败：${status} ${statusText}`);
        }
        return Promise.reject(error);
    }
);

export default request;
